@echo off
SetLocal EnableDelayedExpansion
title BroadVhost 虚拟主机管理系统 V1.0 For IIS 7
mode con COLS=90 lines=30
color 2F
::mshta vbscript:msgbox("本程序操作有风险，请谨慎操作",64,"BroadVhost 虚拟主机管理系统 V1.0 For IIS 7")(window.close)

REM 设置 APPCMD 路径，也可以是 %systemroot%\system32\inetsrv\APPCMD
SET APPCMD=%windir%\system32\inetsrv\appcmd

REM 虚拟主机网站根路径，末尾不能带\
set VhostRootPath=C:\wwwdata\webhosting
REM 用户前缀
set VhostUserPrefix=IWEB_
REM 站点前缀
set VhostPrefix=IWEB_
REM 默认虚拟主机用户组名称，禁止修改，以免权限引起的错误
set localGroup=Broad_Vhost

:SysBegin
    cls
    REM 先把选择的代号清空，以免返回菜单的时候记住了上一次的操作
    SET Choice=''

    echo ———————————————————————————————
    echo S1：IIS7.X 安装   S2：IIS7.X 初始化配置   S3：设置站点物理磁盘路径   S4：设置默认上传大小限制   S5：设置 %WINDIR%\TEMP 目录权限   S6：设置系统密码安全策略   H：查看帮助信息
    echo B1：备份 IIS7.X 站点   B2：还原 IIS7.X 站点   B3：备份虚拟主机设置
    echo V1：新建虚拟主机   V2：删除虚拟主机   Q：退出本程序
    REM 作者:觉罗先生  Website:jueluo.com
    echo ———————————————————————————————

    SET /P Choice=请输入要操作的功能代号编码：
    if '%Choice%'=='' (
        echo 输入不能为空，请重新输入。
        pause
        goto SysBegin
    )
    REM IIS7.X 安装
    if /i '%Choice%'=='S1' goto SetupIIs7
    REM IIS7.X 初始化配置
    if /i '%Choice%'=='S2' goto IIs7InitConfig
    REM 设置站点物理磁盘路径
    if /i '%Choice%'=='S3' goto SetVhostRootPath
    REM 设置默认上传大小限制
    if /i '%Choice%'=='S4' goto SetUploadSizeLimit
    REM 设置 %WINDIR%\TEMP 目录权限
    if /i '%Choice%'=='S5' goto SetTempDirectoryPermissions
    REM 设置系统密码安全策略
    if /i '%Choice%'=='S6' goto SetPasswordPolicy
    REM 查看帮助信息
    if /i '%Choice%'=='H' goto ShowHelp
    REM 备份 IIS7.X 站点
    if /i '%Choice%'=='B1' goto BackupVhostInit
    REM 还原 IIS7.X 站点
    if /i '%Choice%'=='B2' goto RestoreVhostInit
    REM 备份虚拟主机设置
    if /i '%Choice%'=='B3' goto BackupVhostSettings
    REM 新建虚拟主机
    if /i '%Choice%'=='V1' goto AddVhostInit
    REM 删除虚拟主机
    if /i '%Choice%'=='V2' goto DelVhost
    REM 退出本程序
    if /i '%Choice%'=='Q' (exit) else (
        echo 输入错误，请重新输入正确的功能代号编码。
        pause
        goto SysBegin
    )
    goto SysBegin

:SetupIIs7
    cls
    echo 正在添加 IIS 功能，这可能需要几分钟时间...
    start /w pkgmgr /iu:IIS-WebServerRole;IIS-WebServer;IIS-CommonHttpFeatures;IIS-StaticContent;IIS-DefaultDocument;IIS-DirectoryBrowsing;IIS-HttpErrors;IIS-HttpRedirect;IIS-ApplicationDevelopment;IIS-ASP;IIS-CGI;IIS-ISAPIExtensions;IIS-ISAPIFilter;IIS-ServerSideIncludes;IIS-HealthAndDiagnostics;IIS-HttpLogging;IIS-LoggingLibraries;IIS-RequestMonitor;IIS-HttpTracing;IIS-CustomLogging;IIS-ODBCLogging;IIS-Security;IIS-BasicAuthentication;IIS-WindowsAuthentication;IIS-DigestAuthentication;IIS-ClientCertificateMappingAuthentication;IIS-IISCertificateMappingAuthentication;IIS-URLAuthorization;IIS-RequestFiltering;IIS-IPSecurity;IIS-Performance;IIS-HttpCompressionStatic;IIS-HttpCompressionDynamic;IIS-WebServerManagementTools;IIS-ManagementScriptingTools;IIS-IIS6ManagementCompatibility;IIS-Metabase;IIS-WMICompatibility;IIS-LegacyScripts;WAS-WindowsActivationService;WAS-ProcessModel;IIS-FTPServer;IIS-FTPSvc;IIS-FTPExtensibility;IIS-WebDAV;IIS-ASPNET;IIS-NetFxExtensibility;WAS-NetFxEnvironment;WAS-ConfigurationAPI;IIS-ManagementService
    echo IIS 已添加成功!
    echo 请按任意键返回主菜单！
    pause>nul&goto SysBegin

:IIs7InitConfig
    cls
    REM 发送错误到浏览器 false|true
    @echo IIS 设置 - ASP - 发送错误到浏览器
    %APPCMD% set config -section:asp -scriptErrorSentToBrowser:true

    REM 启用父路径 false|true
    @echo IIS 设置 - ASP - 启用父路径
    %APPCMD% set config -section:asp -enableParentPaths:true

    REM 默认文档 +files.[value='home.html']|-files.[value='home.html']
    @echo IIS 设置 - 默认文档添加 index.asp
    %APPCMD% set config -section:defaultDocument /+files.[value='index.asp']

    REM 托管管道模式 Integrated|Classic
    @echo 设置应用池默认设置 - 托管管道模式为经典模式
    %APPCMD% set config -section:system.applicationHost/applicationPools /applicationPoolDefaults.managedPipelineMode:"Classic"

    REM 启用 32 位应用程序 false|true
    @echo 设置应用池默认设置 - 启用 32 位应用程序为 32 位
    %APPCMD% set config -section:applicationPools -applicationPoolDefaults.enable32BitAppOnWin64:"True"

    echo IIS7 初始化配置完成！
    echo 请按任意键返回主菜单！
    pause>nul&goto SysBegin

:SetVhostRootPath
    cls
    REM 选择站点根磁盘路径
    ::for /f "delims=* " %%a in ('getfolder.exe "*". "选择站点根磁盘，如(D:\)" /noquote') do set VhostRootPath=%%a
    ::echo %VhostRootPath%
    echo 已将虚拟主机物理路径设置为：%VhostRootPath%
    REM 创建新目录
    if exist %VhostRootPath% (
        echo 文件夹已经存在
    ) else (
        md %VhostRootPath%
    )
    REM echo 创建站点根路径完成
    mshta vbscript:msgbox("创建站点根路径 %VhostRootPath% 完成.",64,"BroadVhost 虚拟主机管理系统 V1.0 For IIS 7")(window.close)
    goto SysBegin

:SetUploadSizeLimit
    cls
    echo 请输入默认上传大小限制（单位：MB）：
    set /p uploadSizeLimit=
    %APPCMD% set config -section:requestFiltering -requestLimits.maxAllowedContentLength:%uploadSizeLimit%000000
    echo 默认上传大小限制已设置为 %uploadSizeLimit%MB。
    echo 请按任意键返回主菜单！
    pause>nul&goto SysBegin

:SetTempDirectoryPermissions
    cls
    echo y|cacls "%WINDIR%\TEMP" /E /C /G Everyone:R,W
    echo %WINDIR%\TEMP 目录权限已设置为 Everyone 用户读写权限。
    echo 请按任意键返回主菜单！
    pause>nul&goto SysBegin

:ShowHelp
    cls
    echo 脚本名称：BroadVhost 虚拟主机管理系统 V1.0 For IIS 7
    echo 介绍信息：本脚本用于在 Windows Server 上管理 IIS 虚拟主机，包括安装 IIS、初始化配置、创建虚拟主机、备份和还原等功能。
    echo 作者：觉罗先生
    echo 邮箱：暂无
    echo 请按任意键返回主菜单！
    pause>nul&goto SysBegin

:BackupVhostInit
    cls
    REM 备份虚拟主机
    %AppCmd% ADD BACKUP beifen_%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%
        %AppCmd% LIST BACKUP
        ECHO 备份主机完成,路径:C:\Windows\System32\inetsrv\backup
        explorer C:\Windows\System32\inetsrv\backup
    pause>nul&goto SysBegin

:RestoreVhostInit
    cls
    REM 还原虚拟主机
        %AppCmd% LIST BACKUP
    %AppCmd% RESTORE BACKUP beifen_
    pause>nul&goto SysBegin

:BackupVhostSettings
    cls
    REM 备份虚拟主机设置的逻辑待添加
    echo 备份虚拟主机设置功能暂未实现。
    pause>nul&goto SysBegin

:AddVhostInit
    cls
    title BroadVhost 虚拟主机管理系统 V1.0 For Windows 2008 R2
    REM 变量 curSiteName 的值不为空，则清除变量
    if defined curSiteName(SET curSiteName=)
    REM 变量 curSiteDoamin 的值不为空，则清除变量
    if defined curSiteDoamin(SET curSiteDoamin=)
    REM 变量 randomUserPass 的值不为空，则清除变量
    ::if defined randomUserPass(SET randomUserPass=)
    goto SetSiteName

:SetSiteName
    cls
    SET /P curSiteName=请设置一个网站名称（英文）:
    if {%curSiteName%}=={} (
        echo 网站名称不能为空！请重新输入。
        pause
        goto SetSiteName
    ) else (
        goto SetSiteDoamin
    )

:SetSiteDoamin
    cls
    SET /P curSiteDoamin=请输入该网站[%curSiteName%]要绑定的域名（不带 http:// 和 www.）:
    if {%curSiteDoamin%}=={} (
        echo 绑定的域名不能为空！请重新输入。
        pause
        goto SetSiteDoamin
    ) else (
        goto AddVhosting
    )

REM 验证网站名称
:VerifySiteName
    cls
    echo 网站名称不能为空！请重新输入
    pause>nul&goto SetSiteName

:VerifySiteDoamin
    cls
    echo 绑定的域名不能为空！请重新输入
    pause>nul&goto SetSiteDoamin

:AddVhosting
    cls
    REM 判断要添加的用户组是否存在，存在则输出一个空字符串，否则添加用户组
    Net Localgroup %localGroup% >nul 2>&1 && echo. || Net Localgroup /Add %localGroup% /comment:"BroadVhost Group.">nul 2>&1 && echo. || echo 用户组 "%localGroup%" 添加失败。

    REM 创建虚拟主机根目录
    if exist %VhostRootPath% (
        echo 文件夹已经存在
    ) else (
        md %VhostRootPath%
    )

    REM 更改虚拟主机网站根路径权限
    echo y|cacls "%VhostRootPath%" /E /C /R Users
    REM 设置为 IIS_USRS 组读取
    echo y|cacls "%VhostRootPath%" /E /C /G IIS_IUSRS:r

    REM 当前用户名称，加前缀 IUSR_
    SET CurUserName=%VhostUserPrefix%%curSiteName%
    REM 当前主机网站名称，加前缀 IWeb_
    SET CurVhostWebName=%VhostPrefix%%curSiteName%
    REM 当前用户主机路径
    SET CurUserVhostRootPath=%VhostRootPath%\%VhostPrefix%%curSiteName%

    REM 创建用户虚拟主机目录
    if exist "%CurUserVhostRootPath%" (
        echo 文件夹已经存在
    ) else (
        REM 创建站点 FTP 目录
        md "%CurUserVhostRootPath%"
        REM 创建站点日志目录
        md "%CurUserVhostRootPath%\wwwlog"
        REM 创建站点根目录
        md "%CurUserVhostRootPath%\wwwroot"
    )
    echo 虚拟主机目录: %CurUserVhostRootPath% 创建成功。

    REM 扩展本地环境变量延迟
    ::SetLocal EnableDelayedExpansion
    set randomUserPass=
    REM 生成的密码长度,win 推荐 14 位以下
    set /a genPassNum=12
    REM 62 位字符串
    set randomStr=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
    for /L %%i in (1 1 %genPassNum%) do (
        set /a n =!random! %% 62
        for %%n in (!n!) do set randomUserPass=!randomUserPass!!randomStr:~%%n,1!
    )
    echo %randomUserPass%>%CurUserVhostRootPath%\host.ini
    echo [%randomUserPass%]&&pause

    REM 添加本地用户帐号
    Net User %CurUserName% %randomUserPass% /Add /passwordchg:no /expires:never /fullname:"%CurUserName%" /comment:"IIS Vhost User" /home:"%CurUserVhostRootPath%" || echo 添加虚拟主机用户失败。

    REM 设置当前用户密码永不过期
    WMIC USERACCOUNT WHERE "Name='%CurUserName%'" SET PasswordExpires=FALSE
    REM 从默认的 Users 组中删除该用户
    Net Localgroup Users %CurUserName% /Delete
    REM 添加该用户到前面定义的 %localGroup% 组别
    Net Localgroup %localGroup% %CurUserName% /Add

    REM 添加虚拟主机
    %AppCmd% ADD Site /name:"%CurVhostWebName%" /bindings:http/*:8081:%curSiteDoamin%,http/*:8081:www.%curSiteDoamin% /physicalPath:"%CurUserVhostRootPath%\wwwroot"

    echo 设置网站应用程序池,启动网站。
    REM 创建应用程序池(application pool),managedPipelineMode:Integrated(集成);Classic(经典)
    %AppCmd% ADD AppPool /name:"%CurVhostWebName%" /managedPipelineMode:"Classic"
    REM 设置应用程序池的用户
    %AppCmd% SET AppPool "%CurVhostWebName%" /processModel.identityType:SpecificUser /processModel.userName:%CurUserName% /processModel.password:%randomUserPass%
    REM 使用创建的应用程序池
    %AppCmd% SET Site "%CurVhostWebName%" /applicationDefaults.applicationPool:"%CurVhostWebName%"
    REM 启用或禁用匿名身份验证
    %AppCmd% unlock config /section:anonymousAuthentication
    %AppCmd% set config "%CurVhostWebName%" -section:system.webServer/security/authentication/anonymousAuthentication /enabled:"True"
    REM 更改用于匿名访问的默认帐户
    %AppCmd% set config "%CurVhostWebName%" -section:system.webServer/security/authentication/anonymousAuthentication /userName:"%CurUserName%"
    %AppCmd% set config "%CurVhostWebName%" -section:system.webServer/security/authentication/anonymousAuthentication /password:"%randomUserPass%"

    REM 更改当前站点目录权限为
    @echo y|cacls "%CurUserVhostRootPath%" /T /C /P Administrators:f SYSTEM:f %CurUserName%:f
    REM 启动网站
    %AppCmd% START Site "%CurVhostWebName%"

    ::echo 开始添加站点!
    echo 添加站点[%curSiteDoamin%]成功，请按任意键返回主菜单！
    pause>nul&goto AddVhostCompletion

:DelVhost
    cls
    REM 删除虚拟主机的逻辑待添加
    echo 删除虚拟主机功能暂未实现。
    pause>nul&goto SysBegin

:AddVhostCompletion
    cls
    echo 操作完成，请按任意键返回主菜单！
    pause>nul&goto SysBegin

:SetPasswordPolicy
    cls
    REM 禁用“密码必须符合复杂性要求”
    secedit /export /cfg temp.txt
    (for /f "tokens=1,2* delims=: " %%a in (temp.txt) do (
        if "%%a"=="PasswordComplexity" (
            echo PasswordComplexity = 0
        ) else (
            echo %%a:%%b %%c
        )
    )) > new.txt
    secedit /configure /db secedit.sdb /cfg new.txt /overwrite
    del temp.txt
    del new.txt
    echo 已禁用“密码必须符合复杂性要求”。
    REM 更新策略
    gpupdate /force
    echo 策略更新完成。
    echo 请按任意键返回主菜单！
    pause>nul